/**
 * 生成react-addons-update update对象
 * @param fieldName 属性名 多层用 . 隔开， 如 user.name
 * @param value 要设置的值
 * @param result 在此基础上增加修改
 * @param type 默认为 $set, 更多请参考react-addons-update文档
 * @returns {{}} 如("user.name", "Admin") 返回 {user: {name: {$set: "Admin"}}}
 */
import { treePath } from "./TreeUtil";

// @ts-ignore
const createUpdate: Function = (fieldName: string, value: any, type: string = "$set", result: any[] = []): object => {
    let res: any = [result, ...fieldName.split(".")].reduce((obj: any, item: any) => {
        // 如果对象有值则返回， 没有则赋值上空对象返回
        return obj[item] || (obj[item] = {});
        // 给最后一个对象设置上操作类型，和操作参数
    });
    res[type] = value;
    return result;
};

/**
 * 根据数组生成react-addons-update update对象
 * @param updateList 数组格式 [[属性名, value， type]]
 * @param result
 * @returns {{}}
 */
// @ts-ignore
const createUpdates: Function = (updateList: any[], result: object = {}): object => {
    updateList.forEach(v => {
        createUpdate(v[0], v[1], v.length > 2 ? v[2] : undefined, result)
    });
    return result;
};


/**
 * 生成树结构 update 对象
 * @param tree 树结构
 * @param callback 找到指定树节点的函数，返回treu,false
 * @param updateObj 对最终找到的节点的修改对象
 * @returns 拼接到一起的update对象
 */
// @ts-ignore
const createTreeUpdate: Function = (tree: any, callback: Function, updateObj: object, childField: string = "children") => {
    let pathArr: any[] = treePath(tree, callback, childField);
    if (!pathArr) {
        return null;
    }
    let treeUpdate: object = {};
    [treeUpdate, ...pathArr].reduce((obj: any, item: any, i: number, arr: any[]) => {
        if (arr.length === i + 1) {
            return obj[item] = updateObj;
        }
        obj[item] = {};
        return obj[item][childField] = {}
    });
    return treeUpdate;
};


export {
    createUpdate ,
    createUpdates,
    createTreeUpdate
};


